<?php
/*
 * 后台使用到的公共函数
 * @arrange Mark
 * @package ixdcw
 * @file    global.func.php
 * @time    12-12-19 上午10:22
 */
defined('IN_IXDCW') or exit('Access Denied');

/**
 * 后台信息提示
 * @link http://wiki.ixdcw.com:8088/index.php?doc-view-56
 * @param string $msg           提示信息
 * @param string $forward       转向地址,如果是goback则不是自动转向
 * @param string $time          自动转向时间, 使用html的 refresh 功能.
 */
function msg($msg = errmsg, $forward = 'goback', $time = '1') {
	global $CFG;
	if(!$msg && $forward && $forward != 'goback') dheader($forward);
	include DT_ROOT.'/admin/template/msg.tpl.php';
	exit;
}

/**
 * 显示的对话框的内容
 * @link http://wiki.ixdcw.com:8088/index.php?doc-view-57
 * @param $dcontent 显示的内容
 */
function dialog($dcontent) {
	global $CFG;
	include DT_ROOT.'/admin/template/dialog.tpl.php';
	exit;
}

/**
 * 加载后台模块文件
 * @param string $file
 * @param string $mod
 * @return string 加载后台处理文件
 */
function tpl($file = 'index', $mod = 'destoon') {
	return $mod == 'destoon' ? DT_ROOT.'/admin/template/'.$file.'.tpl.php' : DT_CORE.'/'.$mod.'/admin/template/'.$file.'.tpl.php';
}

/**
 * 进程显示
 * @param $sid  开始进程
 * @param $fid  中间进程
 * @param $tid  末尾最大值
 * @return string 进程的表格显示
 */
function progress($sid, $fid, $tid) {
	if($tid > $sid && $fid < $tid) {
		$p = dround(($fid-$sid)*100/($tid-$sid), 0, true);
		if($p > 100) $p = 100;
		$p = $p.'%';
	} else {
		$p = '100%';
	}
	return '<table cellpadding="0" cellspacing="0" width="100%" style="margin:0"><tr><td><div class="progress" style="width:96%;"><div style="width:'.$p.';">&nbsp;</div></div></td><td style="color:#666666;font-size:10px;width:40px;text-align:center;">'.$p.'</td></tr></table>';
}

/**
 * 显示菜单并做好tab
 * @param array $menus 菜单参数, 在管理分配的 inc.php中定义
 */
function show_menu($menus = array()) {
	/*
	array(
		'清空日志',
		'?file='.$file.'&action=truncate',
		'onclick="if(!confirm(\'确定要清空所有404日志吗？\')) return false"'
	);
	*/
	global $module, $file, $action;
	$menu = '';
	foreach($menus as $id=>$m) {
		if(isset($m[1])) {
			$extend = isset($m[2]) ? $m[2] : '';
			$menu .= '<td id="Tab'.$id.'" class="tab"><a href="'.$m[1].'" '.$extend.'>'.$m[0].'</a></td><td class="tab_nav">&nbsp;</td>';
		} else {
			$class = $id == 0 ? 'tab_on' : 'tab';
			$menu .= '<td id="Tab'.$id.'" class="'.$class.'"><a href="javascript:Tab('.$id.');">'.$m[0].'</a></td><td class="tab_nav">&nbsp;</td>';
		}
	}
	include DT_ROOT.'/admin/template/menu.tpl.php';;
}

/**
 * 显示菜单并做好tab
 * @param array $menus 菜单参数, 在管理分配的 inc.php中定义
 */
function showMenu($menus = array()) {
	/*
	array(
		'清空日志',
		'?file='.$file.'&action=truncate',
		'onclick="if(!confirm(\'确定要清空所有404日志吗？\')) return false"'
	);
	*/
	global $module, $file, $action;
	$menu = '';
	foreach($menus as $id=>$m) {
		if(isset($m[1])) {
			$extend = isset($m[2]) ? $m[2] : '';
			$itemId = isset($m[3]) ? $m[3] : "Tab{$id}";
			$menu .= '<a id="'.$itemId.'" href="'.$m[1].'" '.$extend.'>'.$m[0].'<span>&nbsp;</span></a>';
		}
	}
	include DT_ROOT.'/admin/template/xd_menu.tpl.php';;
}

/**
 * 更新 setting数据表的值. 使用批量循环来更新.
 * @param $item
 * @param $setting
 * @return bool
 */
function update_setting($item, $setting) {
	global $db;
	$db->query("DELETE FROM {$db->getPre()}setting WHERE item='$item'");
	foreach($setting as $k=>$v) {
		if(is_array($v)) $v = implode(',', $v);
		$db->query("INSERT INTO {$db->getPre()}setting (item,item_key,item_value) VALUES ('$item','$k','$v')");
	}
	return true;
}

/**
 * 从setting数据库内获得$item项（某模块）的设置数据
 * @param $item     模块id
 * @return array    数组返回设置数据
 */
function get_setting($item) {
	global $db;
	$setting = array();
	$query = $db->query("SELECT * FROM {$db->getPre()}setting WHERE item='$item'");
	while($r = $db->fetchArray($query)) {
		$setting[$r['item_key']] = $r['item_value'];
	}
	return $setting;
}

/**
 * 更新分类的链接
 * @param $CAT
 */
function update_category($CAT) {
	//global $db;
	//$db->query("UPDATE {$db->getPre()}category SET linkurl='$linkurl' WHERE catid=".$CAT['catid']);
	return true;
}

/**
 * http://wiki.ixdcw.com:8088/index.php?doc-view-58
 * @param $tips 提示信息
 */
function tips($tips) {
	echo ' <img src="admin/image/help.png" width="11" height="11" title="'.$tips.'" alt="tips" class="c_p" onclick="Dconfirm(this.title, \'\', 450);" />';
}

/**
 * 保存数组到指定的文件
 * @param $array
 * @param $arrayname
 * @param $file
 * @return bool|number
 */
function array_save($array, $arrayname, $file) {
	$data = var_export($array,true);
	$data = "<?php\n".$arrayname." = ".$data.";\n?>";
	return File::put($file,$data);
}

/**
 * 内容采集
 * @param $url
 * @return array
 */
function fetch_url($url) {
	global $db;
	$fetch = array();
	$tmp = parse_url($url);
	$domain = $tmp['host'];
	$r = $db->getOne("SELECT * FROM {$db->getPre()}fetch WHERE domain='$domain' ORDER BY edittime DESC");
	if($r) {
		$content = File::get($url);
		if($content) {
			$content = Str::convert($content, $r['encode'], DT_CHARSET);
			preg_match("/<title>(.*)<\/title>/isU", $content, $m);
			if(isset($m[1])) $fetch['title'] = trim($r['title'] ? str_replace($r['title'], '', $m[1]) : $m[1]);
			preg_match("/<meta[\s]+name=['\"]description['\"] content=['\"](.*)['\"]/isU", $content, $m);
			if(isset($m[1])) $fetch['introduce'] = $m[1];
			list($f, $t) = explode('[content]', $r['content']);
			if($f && $t) {
				$s = strpos($content, $f);
				if($s !== false) {
					$e = strpos($content, $t, $s);
					if($e !== false && $e > $s) {
						$fetch['content'] = substr($content, $s + strlen($f), $e - $s - strlen($f));
					}
				}
			}
		}
	}
	return $fetch;
}

/**
 * 版本
 * @param $k        版本序号
 * @return array    返回的版本信息
 * @deprecated      不推荐使用, 已经删除
 */
function edition($k = -1) {
	$E = array();
	$E[0] = DT_DOMAIN;
	// 个人版
	$E[1] = '&#20010;&#20154;&#29256;';
	return $k >= 0 ? $E[$k] : $E;
}

/**
 * 管理员日志
 * @param int $force
 * @return bool
 */
function admin_log($force = 0) {
	global $DT, $db, $file, $action, $_username, $DT_QST, $DT_IP, $DT_TIME;
	if($force) $DT['admin_log'] = 2;
	$qstring = $DT_QST;
	if(!$DT['admin_log'] || !$_username || !$qstring || $file == 'index') return false;
	if($DT['admin_log'] == 2 || ($DT['admin_log'] == 1 && ($file == 'setting' || in_array($action, array('delete', 'edit', 'move', 'clear', 'add'))))) {
		// 不记录日志操作
		if(strpos($qstring, 'file=log') !== false) return false;
		$fpos = strpos($qstring, '&forward');
		if($fpos) $qstring = substr($qstring, 0, $fpos);
		$logstring = Cookie::get('logstring');
		// 检测是否操作过
		if($qstring == $logstring)  return false;
		$qstring = preg_replace("/rand=([0-9]{1,})\&/", "", $qstring);
		$db->query("INSERT INTO {$db->getPre()}admin_log(qstring, username, ip, logtime) VALUES('$qstring','$_username','$DT_IP','$DT_TIME')");
		Cookie::set('logstring', $qstring);
	}
}

/**
 * 管理员在线操作
 * @return bool
 */
function admin_online() {
	global $DT, $db, $moduleid, $_username, $DT_QST, $DT_IP, $DT_TIME;
	if(!$DT['admin_online'] || !$_username) return false;
	$qstring = $DT_QST;
	$fpos = strpos($qstring, '&forward');
	if($fpos) $$qstring = substr($qstring, 0, $fpos);
	$qstring = preg_replace("/rand=([0-9]{1,})\&/", "", $qstring);
	$db->query("REPLACE INTO {$db->getPre()}admin_online (sid,username,ip,moduleid,qstring,lasttime) VALUES ('".session_id()."','$_username','$DT_IP','$moduleid','$qstring','$DT_TIME')");	
	$lastime = $DT_TIME - $DT['online'];
	$db->query("DELETE FROM {$db->getPre()}admin_online WHERE lasttime<$lastime");
}

/**
 * 管理权限检测
 * @return bool
 */
function admin_check() {
	global $CFG, $db, $_admin, $_userid, $moduleid, $file, $action, $catid, $_catids, $_childs;
	if(in_array($file, array('logout', 'destoon', 'mymenu'))) return true;//All user
	if($moduleid == 1 && $file == 'index') return true;
	if($CFG['founderid'] && $CFG['founderid'] == $_userid) return true;//Founder
	if($_admin == 2) {              // 普通管理员
		$R = PCache::read('right-'.$_userid.'.php');
		if(!$R) return false;
		// 如果没有设置则是没有权限,设置了是空则是本模块管理员
		if(!isset($R[$moduleid])) return false;
		if(!$R[$moduleid]) return true;//Module admin
		// 文件
		if(!isset($R[$moduleid][$file])) return false;
		if(!$R[$moduleid][$file]) return true;
		// 动作
		if($action && $R[$moduleid][$file]['action'] && !in_array($action, $R[$moduleid][$file]['action'])) return false;
		// catid
		if(!$R[$moduleid][$file]['catid']) return true;
		$_catids = implode(',', $R[$moduleid][$file]['catid']);
		if($catid) {
			if(in_array($catid, $R[$moduleid][$file]['catid'])) return true;
			//Childs
			$result = $db->query("SELECT catid,child,arrchildid FROM {$db->getPre()}category WHERE moduleid=$moduleid AND catid IN ($_catids)");
			while($r = $db->fetchArray($result)) {
				$_childs .= ','.($r['child'] ? $r['arrchildid'] : $r['catid']);
			}
			if(strpos($_childs.',', ','.$catid.',') !== false) return true;
			return false;
		}
	} else if($_admin == 1) {   // 超级管理员

		if(in_array($file, array('admin', 'setting', 'module', 'area', 'database', 'template', 'skin', 'log', 'update', 'group', 'fields', 'loginlog'))) return false;//Founder || Common Admin Only
	}
	return true;
}

/**
 * 类别权限检测
 * @param $itemid
 * @return bool
 */
function item_check($itemid) {
	global $db, $table, $_child, $moduleid;
	// 扩展
	if($moduleid == 3) return true;
	$fd = 'itemid';
	// 会员 / 公司黄页
	if($moduleid == 2 || $moduleid == 4) $fd = 'userid';
	$r = $db->getOne("SELECT catid FROM {$table} WHERE `$fd`=$itemid");
	if($r && $_child && in_array($r['catid'], $_child)) return true;
	return false;
}

/**
 * @param $itemid
 * @return bool     地区检测
 */
function city_check($itemid) {
	global $db, $table, $_areaid, $moduleid;
	if($moduleid == 3) return true;
	$fd = 'itemid';
	if($moduleid == 2 || $moduleid == 4) $fd = 'userid';
	$r = $db->getOne("SELECT areaid FROM {$table} WHERE `$fd`=$itemid");
	if($r && $_areaid && in_array($r['areaid'], $_areaid)) return true;
	return false;
}

/**
 * @param $moduleid
 * @param $part     内容分表
 */
function split_content($moduleid, $part) {
	global $db, $CFG, $MODULE;
	$table = $db->getPre().$moduleid.'_'.$part;
	$fd = $moduleid == 4 ? 'userid' : 'itemid';
	if($db->version() > '4.1' && $CFG['db_charset']) {
		$type = " ENGINE=MyISAM DEFAULT CHARSET=".$CFG['db_charset'];
	} else {
		$type = " TYPE=MyISAM";
	}	
	$db->query("CREATE TABLE IF NOT EXISTS `{$table}` (`{$fd}` bigint(20) unsigned NOT NULL default '0',`content` longtext NOT NULL,PRIMARY KEY  (`{$fd}`))".$type." COMMENT='".$MODULE[$moduleid]['name']."内容_".$part."'");
}

/**
 * sell 分表
 * @param $part
 */
function split_sell($part) {
	global $db, $CFG, $MODULE;
	$sql = File::get(DT_ROOT.'/file/setting/split_sell.sql');
	$sql or Prompt::alert('请检查文件file/setting/split_sell.sql是否存在');
	$sql = str_replace('destoon_sell_1', $db->getPre().'sell_'.$part, $sql);
	if($db->version() > '4.1' && $CFG['db_charset']) {
		$sql .= " ENGINE=MyISAM DEFAULT CHARSET=".$CFG['db_charset'];
	} else {
		$sql .= " TYPE=MyISAM";
	}
	$sql .= " COMMENT='".$MODULE[5]['name']."分表_".$part."';";
	$db->query($sql);
}

/**
 * SEO 标题
 * @param        $title
 * @param string $show
 * @return mixed
 */
function seo_title($title, $show = '') {
	$SEO = array(
		'modulename'		=>	'模块名称',
		'page'				=>	'页码',
		'sitename'			=>	'网站名称',
		'sitetitle'			=>	'网站SEO标题',
		'sitekeywords'		=>	'网站SEO关键词',
		'sitedescription'	=>	'网站SEO描述',
		'catname'			=>	'分类名称',
		'cattitle'			=>	'分类SEO标题',
		'catkeywords'		=>	'分类SEO关键词',
		'catdescription'	=>	'分类SEO描述',
		'showtitle'			=>	'内容标题',
		'showintroduce'		=>	'内容简介',
		'kw'				=>	'关键词',
		'areaname'			=>	'地区',
		'delimiter'			=>	'分隔符',
	);
	if(is_array($show)) {
		foreach($show as $v) {
			if(isset($SEO[$v])) echo '<a href="javascript:_into(\''.$title.'\', \'{'.$SEO[$v].'}\');" title="{'.$SEO[$v].'}">{'.$SEO[$v].'}</a>&nbsp;&nbsp;';
		}
	} else {
		foreach($SEO as $k=>$v) {
			$title = str_replace($v, '$seo_'.$k, $title);
		}
		return $title;
	}
}

/**
 * SEO特殊字符过滤
 * @param $str
 * @return bool
 */
function seo_check($str) {
	foreach(array('<', '>', '(', ')', ';', '?', '\\', '"', "'") as $v) {
		if(strpos($str, $v) !== false) return false;
	}
	return true;
}

/**
 * 文件安装
 * @param     $file
 * @param     $dir
 * @param int $extend
 * @return bool|number
 */
function install_file($file, $dir, $extend = 0) {
	$content = "<?php\n";
	if($extend == 1) $content .= "\n";
	$content .= "require 'config.inc.php';\n";
	$content .= "require '../common.inc.php';\n";
	$content .= "require DT_CORE.'/'.\$module.'/".$file.".inc.php';\n";
	$content .= '?>';
	return File::put(DT_ROOT.'/'.$dir.'/'.$file.'.php', $content);
}

/**
 * 列出模块下的文件夹
 * @param $dir
 * @return array
 */
function list_dir($dir) {
	$dirs = array();
	$files = glob(DT_ROOT.'/'.$dir.'/*');
	if(is_array($files)) {
		include DT_ROOT.'/'.$dir.'/these.name.php';	
		foreach($files as $v) {
			if(is_file($v)) continue;
			$v = basename($v);
			$n = isset($names[$v]) ? $names[$v] : $v;
			$dirs[] = array('dir'=>$v, 'name'=>$n);
		}
	}
	return $dirs;
}

/**
 * 隐藏中间字符, 例如 123456 -> 1****6
 * @param $str
 * @return string
 */
function pass_encode($str) {
	$len = strlen($str);
	if($len < 1) return '';
	$new = '';
	for($i = 0; $i < $len; $i++) {
		$new .= ($i == 0 || $i == $len - 1) ? $str{$i} : '*';
	}
	return $new;
}

/**
 * @param $new
 * @param $old
 * @return mixed
 */
function pass_decode($new, $old) {
	return $new == pass_encode($old) ? $old : $new;
}
